x86: move init_tss into per-CPU space
authorKeir Fraser <keir.fraser@citrix.com>
Mon, 13 Jul 2009 10:31:08 +0000 (11:31 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Mon, 13 Jul 2009 10:31:08 +0000 (11:31 +0100)
Signed-off-by: Jan Beulich <jbeulich@novell.com>
xen/arch/x86/acpi/suspend.c
xen/arch/x86/cpu/common.c
xen/arch/x86/domain.c
xen/arch/x86/hvm/vmx/vmcs.c
xen/arch/x86/setup.c
xen/arch/x86/traps.c
xen/arch/x86/x86_32/mm.c
xen/arch/x86/x86_32/supervisor_mode_kernel.S
xen/arch/x86/x86_32/traps.c
xen/arch/x86/x86_64/traps.c
xen/include/asm-x86/processor.h

index bcb3e83bdeabcc5ea6dd56e02ca6c26a8ab9a49a..2a799e2a6b8f71e4c285c6f88ce4a8cd68a62351 100644 (file)
@@ -57,7 +57,7 @@ void restore_rest_processor_state(void)
     }
 #else /* !defined(CONFIG_X86_64) */
     if ( supervisor_mode_kernel && cpu_has_sep )
-        wrmsr(MSR_IA32_SYSENTER_ESP, &init_tss[smp_processor_id()].esp1, 0);
+        wrmsr(MSR_IA32_SYSENTER_ESP, &this_cpu(init_tss).esp1, 0);
 #endif
 
     /* Maybe load the debug registers. */
index 9572c57682a55571a2c63e0b1c56d7f7cb4b1638..c2478f418555f321086989756a51c3e23dca2189 100644 (file)
@@ -576,7 +576,7 @@ void __init early_cpu_init(void)
 void __cpuinit cpu_init(void)
 {
        int cpu = smp_processor_id();
-       struct tss_struct *t = &init_tss[cpu];
+       struct tss_struct *t = &this_cpu(init_tss);
        struct desc_ptr gdt_desc = {
                .base = (unsigned long)(this_cpu(gdt_table) - FIRST_RESERVED_GDT_ENTRY),
                .limit = LAST_RESERVED_GDT_BYTE
index 722d518bba68b391263fc3c6167aabda42da5ec1..1f475adfc97db50822209c509315d90305715393 100644 (file)
@@ -1223,7 +1223,7 @@ static void save_segments(struct vcpu *v)
 
 static inline void switch_kernel_stack(struct vcpu *v)
 {
-    struct tss_struct *tss = &init_tss[smp_processor_id()];
+    struct tss_struct *tss = &this_cpu(init_tss);
     tss->esp1 = v->arch.guest_context.kernel_sp;
     tss->ss1  = v->arch.guest_context.kernel_ss;
 }
index db461da52ec9bc9cc704cbd05b22cc363d17a8e8..4a30a7d395d0ed7dc0c20bc70930558278ab1db7 100644 (file)
@@ -502,7 +502,7 @@ static void vmx_set_host_env(struct vcpu *v)
     __vmwrite(HOST_IDTR_BASE, (unsigned long)idt_tables[cpu]);
 
     __vmwrite(HOST_TR_SELECTOR, TSS_ENTRY << 3);
-    __vmwrite(HOST_TR_BASE, (unsigned long)&init_tss[cpu]);
+    __vmwrite(HOST_TR_BASE, (unsigned long)&per_cpu(init_tss, cpu));
 
     __vmwrite(HOST_SYSENTER_ESP, get_stack_bottom());
 
index 07c11c9788c597b6c5769f927187e4df5d413f02..8fb5bcdd6f1a5da13f192d83cd290c87f46faa28 100644 (file)
@@ -117,7 +117,7 @@ DEFINE_PER_CPU(struct desc_struct *, compat_gdt_table)
     = boot_cpu_compat_gdt_table;
 #endif
 
-struct tss_struct init_tss[NR_CPUS];
+DEFINE_PER_CPU(struct tss_struct, init_tss);
 
 char __attribute__ ((__section__(".bss.stack_aligned"))) cpu0_stack[STACK_SIZE];
 
index f39d371699bcc484a3ebc65cedc2f32eb07cbf9c..a2adcfa26af9078c94237067f46681a0aff1d026 100644 (file)
@@ -326,7 +326,7 @@ void show_stack_overflow(unsigned int cpu, unsigned long esp)
 
     printk("Valid stack range: %p-%p, sp=%p, tss.esp0=%p\n",
            (void *)esp_top, (void *)esp_bottom, (void *)esp,
-           (void *)init_tss[cpu].esp0);
+           (void *)per_cpu(init_tss, cpu).esp0);
 
     /* Trigger overflow trace if %esp is within 512 bytes of the guard page. */
     if ( ((unsigned long)(esp - esp_top) > 512) &&
@@ -3066,7 +3066,7 @@ void set_intr_gate(unsigned int n, void *addr)
 
 void load_TR(void)
 {
-    struct tss_struct *tss = &init_tss[smp_processor_id()];
+    struct tss_struct *tss = &this_cpu(init_tss);
     struct desc_ptr old_gdt, tss_gdt = {
         .base = (long)(this_cpu(gdt_table) - FIRST_RESERVED_GDT_ENTRY),
         .limit = LAST_RESERVED_GDT_BYTE
index 99b54769b3d36ea8d02673ff849619ce91c4244a..09b65a3b0c355cf2aa97873de545d43397dfc984 100644 (file)
@@ -227,8 +227,7 @@ long subarch_memory_op(int op, XEN_GUEST_HANDLE(void) arg)
 
 long do_stack_switch(unsigned long ss, unsigned long esp)
 {
-    int nr = smp_processor_id();
-    struct tss_struct *t = &init_tss[nr];
+    struct tss_struct *t = &this_cpu(init_tss);
 
     fixup_guest_stack_selector(current->domain, ss);
 
index a4fae6c3f360b47ea2e72142229e7ae42de56715..2719aaf25a88c651e9342b711eff3ce85b2f4341 100644 (file)
@@ -102,8 +102,8 @@ ENTRY(fixup_ring0_guest_stack)
 
         movl  $PER_CPU_GDT_ENTRY*8,%ecx
         lsll  %ecx,%ecx
-        shll  $7,%ecx                                   # Each TSS entry is 0x80 bytes
-        addl  $init_tss,%ecx
+        shll  $PERCPU_SHIFT,%ecx
+        addl  $per_cpu__init_tss,%ecx
 
         # Load Xen stack from TSS.
         movw  TSS_ss0(%ecx),%ax
index 062c996d11e1bd7060285addee83722436550429..406098046cf16869fd13cf159d57e5914a1f2683 100644 (file)
@@ -204,7 +204,7 @@ asmlinkage void do_double_fault(void)
     asm ( "lsll %1, %0" : "=r" (cpu) : "rm" (PER_CPU_GDT_ENTRY << 3) );
 
     /* Find information saved during fault and dump it to the console. */
-    tss = &init_tss[cpu];
+    tss = &per_cpu(init_tss, cpu);
     printk("*** DOUBLE FAULT ***\n");
     print_xen_info();
     printk("CPU:    %d\nEIP:    %04x:[<%08x>]",
index 5773a1b22f1941c27c35a18931c20a9c26b5c902..f458f491c7df2fe73f0dd285f43dbef5d9037911 100644 (file)
@@ -433,13 +433,13 @@ void __devinit subarch_percpu_traps_init(void)
     BUILD_BUG_ON((IST_MAX + 2) * PAGE_SIZE + PRIMARY_STACK_SIZE > STACK_SIZE);
 
     /* Machine Check handler has its own per-CPU 4kB stack. */
-    init_tss[cpu].ist[IST_MCE] = (unsigned long)&stack[IST_MCE * PAGE_SIZE];
+    this_cpu(init_tss).ist[IST_MCE] = (unsigned long)&stack[IST_MCE * PAGE_SIZE];
 
     /* Double-fault handler has its own per-CPU 4kB stack. */
-    init_tss[cpu].ist[IST_DF] = (unsigned long)&stack[IST_DF * PAGE_SIZE];
+    this_cpu(init_tss).ist[IST_DF] = (unsigned long)&stack[IST_DF * PAGE_SIZE];
 
     /* NMI handler has its own per-CPU 4kB stack. */
-    init_tss[cpu].ist[IST_NMI] = (unsigned long)&stack[IST_NMI * PAGE_SIZE];
+    this_cpu(init_tss).ist[IST_NMI] = (unsigned long)&stack[IST_NMI * PAGE_SIZE];
 
     /* Trampoline for SYSCALL entry from long mode. */
     stack = &stack[IST_MAX * PAGE_SIZE]; /* Skip the IST stacks. */
index 568e8c2571397e327e537fb061854a7089444a18..9d0e77460c4cafbf6ee9342636b0c2a00895bbeb 100644 (file)
@@ -456,7 +456,7 @@ struct tss_struct {
 extern idt_entry_t idt_table[];
 extern idt_entry_t *idt_tables[];
 
-extern struct tss_struct init_tss[NR_CPUS];
+DECLARE_PER_CPU(struct tss_struct, init_tss);
 
 extern void init_int80_direct_trap(struct vcpu *v);